#pragma once

#include <string.h>
#include <string>
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <iostream>
#include <time.h>
#include <stdbool.h>
#include <climits>
#include <vector>
#include <queue>
#include <algorithm>
#include <math.h>
// #include <windows.h>
using namespace std;

// 存储文件
static const char *filename = "Data.txt";

// 数据类型
typedef pair<int, int> Pair;
typedef int DataType;
typedef int XYType;
typedef char NameType;
typedef char IntroType;

// 宏定义
#define MAX 9999     // 无道路==>无穷大
#define MVNum 20     // 最大地点数
#define Unit 200     // 坐标系单元长度
#define IntroLen 800 // 简介长度
#define NameLen 20

// 菜单选项
enum Input
{
    EXIT,
    ADDVex,
    ADDArc,
    DELVex,
    DELArc,
    SEARCHVex,
    SEARCHArc,
    MODIFYVex,
    MODIFYArc,
    SHOWVex,
    SHOWArc,
    SHOWMap,
    SHOWMatrix,
    CLEARMap,
    SHOWPath,
    CLEARArc,
    LAYCIRCUIT,
    PASSALLVexPath,
    PASSALLVexLoop
};

// 顶点信息
typedef struct Location
{
    NameType name[NameLen];
    XYType x, y;
    IntroType intro[IntroLen];
} Location;

// 地图信息
typedef struct Campus_Route
{
    DataType vexnum;
    Location vexs[MVNum];
    DataType arcs[MVNum][MVNum];
    DataType arcnum;
} Map;

// 格式化地图
void ClearMap(Map *map);

// 清除所有地点
void ClearArc(Map *map);

// 加载文件信息到地图
void LoadMap(const char *filename, Map *map);

// 初始化地图
void InitMap(const char *filename, Map *map);

// 已知两地点下标求距离[向上取整]
int CalDistance(const Map *map, const int a, const int b);

// 增加地点信息
void AddVexMap(Map *map);

// 增加道路信息
void AddArcMap(Map *map);

// 删除某个地点
void DelVexMap(Map *map);

// 删除某个道路
void DelArcMap(Map *map);

// 查找某个地点
void SearchVexMap(const Map *map);

// 查找某个道路
void SearchArcMap(const Map *map);

// 修改某个地点
void ModifyVexMap(Map *map);

// 修改某个地点
void ModifyArcMap(Map *map);

// 打印地图中所有地点
void ShowVexMap(const Map *map);

// 打印地图中所有道路
void ShowArcMap(const Map *map);

// 打印整个地图
void ShowMap(const Map *map);

// 显示当前矩阵数据
void ShowMatrix(const Map *map);

// 计算从obj到其他所有地点的最短简单路径[递增输出]
void ShowShortest_Path(const Map *map);

// 最短通电线路(铺路规划,每条电路长度,电路总长度) ==> MST
void Lay_Circuit(const Map *map);

// A地出发经过所有点且距离最短(可重复)
void PassAllVex_Path(const Map *map);

// A地出发过所有点回到A点且距离最短(可重复)
void PassAllVex_Loop(const Map *map);

// 保存文件信息到文件
void SaveMap(const char *filename, Map *map);